home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / biz / misc / etb.lha / etbV1.00 / devel / DEVEL.DOC next >
Text File  |  1995-05-01  |  15KB  |  361 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.    ETB                           DEVELOPERS NOTES                           ETB
  8.  
  9.          PROGRAM STATISTICS
  10.          ==================
  11.  
  12.  
  13.                             lines   pages
  14.          etb.c               618     10
  15.          etb.h               106      2
  16.          main.c               23      1
  17.          mcstd.h              31      1
  18.          mcstring.c          214      4
  19.          parsecli.c          129      2
  20.                             ----     --
  21.                             1148     20
  22.                             ====     ==
  23.  
  24.  
  25.  
  26.          STUNTED GROWTH
  27.          ==============
  28.  
  29.  
  30.          This  document  was  originally  going to be quite a substantial
  31.          effort. Since then, I have had a change of heart, and decided to
  32.          be  a  bit  minimalist.  I  do  have  a fair bit of paperwork of
  33.          interest  to   programers   -   most   notably,   the   function
  34.          descriptions. As it is, I decided to cut all the effort involved
  35.          in producing a file for it. Let me know if you are interested in
  36.          more  developer documentation,  and I will consider writing some
  37.          of it up.
  38.  
  39.  
  40.  
  41.          DESIGN PHILOSOPHY
  42.          =================
  43.  
  44.  
  45.          This software has been written with PORTABILITY and HIERARCHICAL
  46.          INTEGRITY in mind.  'Portability' means that the code can easily
  47.          be transported from one machine to another, and from compiler to
  48.          compiler.  The  best  standard  to  attain  is  whereby the code
  49.          successfully  compiles  on  all  machines,   using  every  ANSI-
  50.          compliant  compiler  - and it is the SAME code.  In other words-
  51.          there shouldn't be one program for a Unix machine,  a  different
  52.          one  for  a  Lattice compiler,  and yet another one for the Dice
  53.          compiler. Write the code once- and it will work everywhere.  How
  54.          can  this  be  achieved?  I  think  the answer lies in using the
  55.          Makefile and compiler definitions properly.  As an example, look
  56.          at  the  file 'etb.h'.  It contains two structures- etb_line and
  57.          trans_line.  You will notice that 'struct' is  preceded  by  the
  58.          word 'FAR'. Ordinarily, the program wont compile under Dice. The
  59.  
  60.    Version 1.00             Last Change: 30 April 1995                        1
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.    ETB                           DEVELOPERS NOTES                           ETB
  68.  
  69.          structures are too big,  and interfere with relative  addressing
  70.          calls.  The fix in DICE is to declare the structs as __far. This
  71.          generates absolute addressing code under  a  large  data  model.
  72.          __far is,  as far as I know (and I don't know much, because I am
  73.          new to C), unique to DICE. So, if I had written the lines as
  74.                  __far struct etb_line
  75.          and
  76.                  __far struct trans_line,
  77.          then everything would work fine under DICE, but hopelessly under
  78.          any other compiler.  Notice my design solution to the problem. I
  79.          define FAR as __far if _DCC is defined (which  is  an  automatic
  80.          definition under DICE- it is never necessary to define it in the
  81.          code),  but leave it blank if _DCC isn't defined.  In this  way,
  82.          the  code  compiles  fine  under DICE and is still theoretically
  83.          okay for every other compiler. I say 'theoretically', of course,
  84.          because  other  compilers might encounter the same problem,  and
  85.          require further tinkering to get it to work.  Obviously I  can't
  86.          be  expected  to know how every compiler will behave,  but I can
  87.          eliminate potential sources of  confusion  and  incompatibility,
  88.          and make life as generally nice as possible.
  89.  
  90.          This brings me onto HIERARCHICAL INTEGRITY.  This is term I just
  91.          made up to refer to the desire that an enhancement  should  make
  92.          the program work better after it has been modified,  rather than
  93.          worse. The features in the program should work in a hierarchical
  94.          fashion.  At  it's  base,  we  have  it's ability to be executed
  95.          through a shell.  Later on,  we may want to add a Graphical User
  96.          Interface.  This is a more refined feature.  If we add it to the
  97.          program,  we shouldn't just ditch  the  Command  Line  Interface
  98.          stuff.  Shell processing is important, and should be maintained.
  99.          Adding GUI code to the program should be done  in  a  harmonious
  100.          way,  without  assuming  that  the  old stuff is crap (unless it
  101.          really is crap, of course).
  102.  
  103.          The importance of constructing features in  a  pyramidal  manner
  104.          was  impressed  upon me when I wrote a program to allocate files
  105.          to  floppy  disks.   The  program  had  a  sexy  Graphical  User
  106.          Interface-  a real wonder of visual excitement.  However,  there
  107.          were costs to this  GUI.  The  first  is  that  it  had  no  CLI
  108.          processing  ability-  all the programming effort was invested in
  109.          the GUI.  This is  great  for  novice  users,  who  like  to  do
  110.          everything  with  the  mouse.  It  is not so great for the power
  111.          user,  who might want to take  a  batch-oriented  approach.  The
  112.          floppy  disk program might be only one step in a chain of events
  113.          (although admittedly this is unlikely given the  nature  of  the
  114.          program).  Secondly,  OVER  HALF  of  the program line count was
  115.          dedicated to GUI activities.  The 'clever bit' of  the  program,
  116.          i.e.  the  bit  that  actually  worked out which files should be
  117.          allocated to which floppies,  didn't take much effort.  I  could
  118.          have  saved  myself a lot of time by ignoring the graphics,  and
  119.  
  120.    Version 1.00             Last Change: 30 April 1995                        2
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.    ETB                           DEVELOPERS NOTES                           ETB
  128.  
  129.          just coded for the CLI.  Later  on,  if  I  thought  the  effort
  130.          justified  it,  I  could  have  added  the  fancy  stuff.  As  a
  131.          developer-user,  I would  have  settled  for  the  CLI.  From  a
  132.          programmer's  viewpoint,  the  less features I put in,  the less
  133.          work I  have  to  do.  From  a  user's  viewpoint,  I  want  the
  134.          programmer  to put in loads of features to make my life  as easy
  135.          as possible.  Taking the two together,  I  try  to  balance  the
  136.          utility of adding a feature with the sweat expended in producing
  137.          it. If there is a moral in all this, it is this: keep it simple,
  138.          functional and flexible, and build up later if needed.
  139.  
  140.          So  far,  I have not discussed consistency of platform features.
  141.          In other words,  should the features provided by the program  on
  142.          one   machine  be  identical  to  that  on  the  other  machine?
  143.          Presumably, the answer should be 'Yes'.  But let me suggest that
  144.          the answer is, in fact, 'No'. Adding a GUI for an Amiga is a lot
  145.          easier than adding a GUI for the Sun system- for the simple fact
  146.          that  I know a lot more about the Amiga than I do about the Sun.
  147.          So it would be unrealistic for me to attempt a GUI for the  Sun,
  148.          but  within  the  realms  of  possibility  to attempt it for the
  149.          Amiga.  So it is likely that the Amiga version  will  have  more
  150.          features than the Sun. That's life! Notice how, that by adopting
  151.          a hierarchical approach,  everything has a solid  base  to  work
  152.          from.  It still works on Unix,  just not as well.  What is more,
  153.          features might not be consistent between compilers,  even on the
  154.          same  platform.  For instance,  adding Workbench startup code is
  155.          easier for the DICE compiler relative to Lattice.  Now  I  could
  156.          code  everything  using  only  Operating  System routines- so it
  157.          would be quid pro quo as regards which compiler is the  best  to
  158.          write  for.  But  I  would prefer to use some of the refinements
  159.          that DICE provides.  So I'd probably take the easy  option,  and
  160.          let  the  Lattice  bods  add  in  some of their own code if they
  161.          thought it necessary.
  162.  
  163.  
  164.  
  165.  
  166.          COMPILER IDIOSYNCRASIES
  167.          =======================
  168.  
  169.  
  170.          This  section not intended to be a user manual for the owners of
  171.          the various  compilers.  It  exists  to  provide  notes  on  the
  172.          vagaries of individual compilers to aid the porting of code.
  173.  
  174.          DICE
  175.          ----
  176.  
  177.          This is an excellent compiler for  the  Amiga  (thank  you  Matt
  178.          Dillon).  It  has  nearly  always  only been available in Public
  179.  
  180.    Version 1.00             Last Change: 30 April 1995                        3
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.    ETB                           DEVELOPERS NOTES                           ETB
  188.  
  189.          Domain (I think) as a shareware program.  Recently,  it has been
  190.          available  as  a commercial release.  There are a fair number of
  191.          other Public Domain C compilers for the Amiga,  but  none  match
  192.          the  standards  of  DICE.  On  the commercial front,  people can
  193.          choose from Lattice, SAS, or Manx (I am probably wrong here- SAS
  194.          might  be  the same as Lattice).  Lattice seems the more popular
  195.          one.  I see that developers refer to both Lattice  and  Manx  in
  196.          their   distributions.   Does  this  mean  that  they  own  BOTH
  197.          compilers?  Surely their drive for comparability can't  outweigh
  198.          the cost of buying two packages?
  199.  
  200.          I  heard  recently  that Lattice is withdrawing support for it's
  201.          users.  I haven't seen an advert for the  Lattice  compiler  for
  202.          some  time,  but  I  have  seen  a  price  of about £200 (pounds
  203.          sterling) in the latest advertisement  mentioning  C  compilers-
  204.          although  I am not sure if it was for Lattice or not.  The point
  205.          is this:  most C compilers for the Amiga retail at  about  £200,
  206.          most compilers do now not exist, DICE retails as about £100, and
  207.          DICE has been made popular through the PD scene. I can therefore
  208.          see that DICE will be the dominant compiler for the Amiga.
  209.  
  210.          Not that this discussion is doing any good at all...
  211.  
  212.          Environment definitions
  213.          -----------------------
  214.  
  215.          Amongst other definitions, DICE has the following definitions in
  216.          it's preprocessor:
  217.                  _DCC    : signifies that the compiler is DICE
  218.                  AMIGA   : signifies that the computer is an Amiga.
  219.  
  220.          These  definitions  are  created automatically.  It is therefore
  221.          easy to embed DICE- or Amiga- specific code in  a  program.  The
  222.          following example shows how this might be done:
  223.  
  224.                  #ifdef _DCC
  225.                      ... DICE specific code ...
  226.                  #else
  227.                      ... generic, maybe not so good, code ...
  228.                  #endif
  229.  
  230.  
  231.          Large data model
  232.          ----------------
  233.  
  234.          DICE  uses  __far to force variable declarations to be addressed
  235.          using absolute addressing.  Useful  (in  fact  necessary  in  my
  236.          program) when lots of variable space is needed.
  237.  
  238.          DMakefile
  239.  
  240.    Version 1.00             Last Change: 30 April 1995                        4
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.    ETB                           DEVELOPERS NOTES                           ETB
  248.  
  249.          ---------
  250.  
  251.          This is DICE's name for a  Makefile.  I  have  only  been  using
  252.          makefiles  for  a short time now (that's how new to C I am!)- so
  253.          it is difficult to compare DMakfiles with Makefiles.  Treat them
  254.          as being identical,  with DICE's facilities at least as powerful
  255.          as any other.
  256.  
  257.          Compiler commands
  258.          -----------------
  259.  
  260.          DICE's  compiler  is  called  'dcc'.  Here  I  list the compiler
  261.          commands that I used in my DMakefile (DICE has, of course, many,
  262.          many, other commands)-
  263.                  -proto       force prototype checking. You can forget
  264.                               this for porting purposes.
  265.                  -E filename  sends any error messages to filename. Port
  266.                               this one however you like.
  267.  
  268.          wbmain()
  269.          --------
  270.  
  271.          DICE  has  a  novel  way  of  coping  with  startup  from  Amiga
  272.          Workbench.  If you port to a non-Amiga environment, then you can
  273.          ignore this function, as it is part of the GUI. Don't cut it out
  274.          of  your  code,  though-  remember,  I  want my program to be as
  275.          uniform as possible ("one program works everywhere").
  276.  
  277.          DICE executes wbmain(),  instead of main(),  if the  program  is
  278.          started  from  Workbench.  Bear this in mind when writing Amiga-
  279.          specific stuff. Also, people using Lattice, say, with a GUI need
  280.          to  mess about with WB messages,  and reply to them.  DICE works
  281.          differently,  and a reply to  a  workbench  message  will  cause
  282.          problems. The moral is clear for people developing GUI's for the
  283.          Amiga: the graphics facilities are identical regardless of which
  284.          Amiga  compiler  is  used,  EXCEPT for the workbench startup- so
  285.          separate the code between DICE and non-DICE.
  286.  
  287.          Note:  this subsection is being written before I  have  finished
  288.          writing the actual program (the time is now 5.30am on a Saturday
  289.          morning).  Although the program is on the verge of completion, I
  290.          don't  know if I'll chuck in some (unspectacular,  and extremely
  291.          basic) GUI stuff at the last moment.  You'll  have  to  actually
  292.          look at the program to find out.
  293.  
  294.          Library bases
  295.          -------------
  296.  
  297.          DICE saves you the fiddle of declaring Library base  structures,
  298.          and  doing all the OpenLibrary() and CloseLibrary() stuff.  It's
  299.  
  300.    Version 1.00             Last Change: 30 April 1995                        5
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307.    ETB                           DEVELOPERS NOTES                           ETB
  308.  
  309.          all  taken  care  of  automatically.  Hurrah!  This  comment  is
  310.          directed  at the Amiga GUI writer.  In the 'ROM Kernel Reference
  311.          Manual:  Libraries',  pages 217 and 218 give examples  of  using
  312.          EasyRequest().      But,      where     did     I     put     my
  313.          'struct  Library  *IntuitionBase',  and  the  OpenLibrary()  and
  314.          CloseLibrary()? Not there! Surely a mistake? Nope- everything is
  315.          fine. Lattice people can go write their own routines for this if
  316.          they  want.  I don't want to take two bottles into the shower- I
  317.          just want to Wash and Go- and now I can, with new improved DICE.
  318.  
  319.          I hope that this is genuinely useful stuff. I like the idea that
  320.          people will actually be developing my code,  rather than leaving
  321.          me to do it all myself,  or express no interest in my program at
  322.          all.
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  
  356.  
  357.  
  358.  
  359.  
  360.    Version 1.00             Last Change: 30 April 1995                        6
  361.